package cc.shacocloud.kotlin.tools.jdbc

import java.sql.*

/**
 *
 * @author 思追(shaco)
 */
object JdbcUtil {

    /**
     *确定要使用的列名称。列名是根据使用 ResultSetMetaData 进行查找。
     */
    fun ResultSetMetaData.lookupColumnName(columnIndex: Int): String {
        var name = getColumnLabel(columnIndex)
        if (name.isNullOrBlank()) {
            name = getColumnName(columnIndex)
        }
        return name
    }

    /**
     * 使用最合适的类型。返回的值应为分离值对象，而不具有与活动 ResultSet 的任何关联
     *
     * 特别是，它不应是 Blob 或
     * Clob 对象，而是分别是字节数组或 String 表示。
     */
    fun ResultSet.getResultSetValue(index: Int): Any? {
        var obj = getObject(index)
        var className: String? = null
        if (obj != null) {
            className = obj.javaClass.name
        }
        if (obj is Blob) {
            obj = obj.getBytes(1, obj.length().toInt())
        } else if (obj is Clob) {
            obj = obj.getSubString(1, obj.length().toInt())
        } else if ("oracle.sql.TIMESTAMP" == className || "oracle.sql.TIMESTAMPTZ" == className) {
            obj = getTimestamp(index)
        } else if (className != null && className.startsWith("oracle.sql.DATE")) {
            val metaDataClassName = metaData.getColumnClassName(index)
            obj = if ("java.sql.Timestamp" == metaDataClassName || "oracle.sql.TIMESTAMP" == metaDataClassName) {
                getTimestamp(index)
            } else {
                getDate(index)
            }
        } else if (obj is Date) {
            if ("java.sql.Timestamp" == metaData.getColumnClassName(index)) {
                obj = getTimestamp(index)
            }
        }
        return obj
    }

}